[Jest] テストFail時に備えて後処理はafterAll()またはafterEach()で実施する
こんにちは、CX事業本部 IoT事業部の若槻です。
Jestは、JavaScriptのテスティングフレームワークです。Facebookが開発しています。
今回は、JestではテストのFail時に備えて後処理はafterAll()
またはafterEach()
で実施しよう、という記事です。
test()
内でFailしたテスト以降の処理は実行されない
次のようなテストがあります。test()
の冒頭でテストで使用するtemp
フォルダを作成し、末尾で後処理として削除しています。(今回はexpect(1).toBe(1)
のように簡略化していますが、実際のテスト対象のコードはこちらの記事のようなファイル作成処理を伴うコードをイメージしています)
import fs from 'fs'; import path from 'path'; test('Case1', () => { const tempPath = path.join(__dirname, 'temp'); fs.mkdirSync(tempPath); //前処理:フォルダ作成 expect(1).toBe(1); //Passするテスト fs.rmdirSync(tempPath); //後処理:フォルダ削除 });
テスト実行すると予想通り成功します。
$ jest sample.test.ts PASS sample.test.ts ✓ Case1 (2 ms)
temp
フォルダも後処理としてちゃんと削除されています。
$ ls sample.test.ts
続いて、次のようなテストです。同じく前処理のフォルダ作成、後処理のフォルダ削除を行いますが、テストはFailします。
test('Case2', () => { const tempPath = path.join(__dirname, 'temp'); fs.mkdirSync(tempPath); //前処理:フォルダ作成 expect(1).toBe(2); //Failするテスト fs.rmdirSync(tempPath); //後処理:フォルダ削除 });
テストを実行すると失敗します。
$ jest sample.test.ts FAIL sample.test.ts ✕ Case2 (4 ms) ● Case2 expect(received).toBe(expected) // Object.is equality Expected: 2 Received: 1 6 | fs.mkdirSync(tempPath); 7 | > 8 | expect(1).toBe(2); | ^ 9 | 10 | fs.rmdirSync(tempPath); 11 | });
この時、作成されたtemp
フォルダが削除されず残ってしまいます。これは、失敗したexpectマッチャーの箇所でテストの実行が停止し、後処理のフォルダ削除が実行されないためです。
$ ls sample.test.ts temp
afterAll()
またはafterEach()
で後処理を実施する
afterAll()
またはafterEach()
を使用すれば、テストの成否に関わらず後処理を実施することができます。
下記のテストはFailしますが、後処理のフォルダ削除はafterAll()
により必ず実行されます。
describe('sample', () => { const tempPath = path.join(__dirname, 'temp'); afterAll(() => { fs.rmdirSync(tempPath); //後処理:フォルダ削除 }); test('Case2', () => { fs.mkdirSync(tempPath); expect(1).toBe(2); //Failするテスト }); });
describe
ブロック内に複数のtest()
がある場合は、afterEach()
を使えば各テストの終了後に後処理が行われます。
describe('sample', () => { const tempPath = path.join(__dirname, 'temp'); afterEach(() => { fs.rmdirSync(tempPath); //後処理:フォルダ削除 }); test('Case1', () => { fs.mkdirSync(tempPath); expect(1).toBe(1); }); test('Case2', () => { fs.mkdirSync(tempPath); expect(1).toBe(2); }); });
まとめ
- JestでテストFail時は
it()
ブロック内でのそれ以降の処理は実行されない。 - テストのFail時に備えて後処理は
afterAll()
またはafterEach()
で実施するようにしよう。
参考
以上